/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package App;

import networking.*;
import generated.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Properties;
import javax.xml.bind.JAXBException;


/**
 *
 * @author lars.kloeser
 */
public class App {
    
    static MoveFactory factory = new MoveFactory();
    public static final String IP_OF_SERVER = "localhost";
    
    public static void main(String[] args) throws IOException, JAXBException, InterruptedException {
        //Verbindung zum Server
        Socket serverSocket = new Socket(IP_OF_SERVER,5123);
        OutputStream outStream = serverSocket.getOutputStream();
        InputStream inStream = serverSocket.getInputStream();
        
        XmlOutStream out = new XmlOutStream(outStream);
        XmlInStream in = new XmlInStream(inStream);
        
        //Login Vorgang
        int id = 0;
        MazeCom loginMsg = new MazeCom();
        LoginMessageType loginMsgType = new LoginMessageType();
        loginMsgType.setName("Kipkorn");
        loginMsg.setMcType(MazeComType.LOGIN);
        loginMsg.setLoginMessage(loginMsgType);
        out.write(loginMsg);
        
        // Login Reply Empfangen
        MazeCom loginReply = in.readMazeCom();
        if(loginReply.getMcType().equals(MazeComType.LOGINREPLY)){
            id = loginReply.getLoginReplyMessage().getNewID();
		    System.err.println("[INFO] Eingelogged mit Id: "+id); 
            
            // ersten Zug
            
        }else{
            AcceptMessageType acceptMessage = loginReply.getAcceptMessage();
            // neues Login vorbereiten
        }
        int counter = 1;
        while(true){
            //Mach ersteinmal einen Regulären zug
            System.out.println("[INFO] Starte durchlauf und berechne regulären "+counter+" Zug");
            MazeCom await = in.readMazeCom();
            if(await.getWinMessage() != null){
                System.out.println("[INFO] Spiel ist vorbei");
                if(await.getWinMessage().getWinner().getId() == id){
                    System.out.println("[WINNER] GEWONNEN");
                    return;
                }else{
                    System.out.println("[WINNER] Verloren");
                    return;
                }
            }
            AwaitMoveMessageType awaitMove = await.getAwaitMoveMessage();
            MazeCom move = null;

            try{
                factory.calcMoves(id, awaitMove);
                move = factory.getTopMove();
//                move = factory.getRandomMove(id, awaitMove);
            }catch(Exception e){
                System.out.println("[ERROR] Exception beim berechenen der Züge, nehme Dummy-Zug");
                e.printStackTrace();
                move = factory.getDummyMove(id,awaitMove);
            }
            out.write(move);
            System.out.println("[INFO] erwarte "+counter+" antwort");
            // erwarte erste Antwort
            MazeCom accept = in.readMazeCom();
            if(accept.getAcceptMessage().getErrorCode().equals(ErrorType.NOERROR)){
                System.out.println("[INFO] Erfolgreicher Zug");
                continue;
            }
            else if(accept.getAcceptMessage().getErrorCode().equals(ErrorType.AWAIT_MOVE)){
                System.out.println("[INFO] Warte auf Zug");
                // neuen Zug berechnen
            }
            else if(accept.getAcceptMessage().getErrorCode().equals(ErrorType.ILLEGAL_MOVE)){
                System.out.println("[INFO] Nicht zulässiger Zug");
                continue;
//                System.out.println("[WARN] Erster Zug ist nicht Zulässig");
//                MazeCom accept2 = in.readMazeCom();
////                move = factory.getAlterativeMove();
//                move = factory.getDummyMove(id,accept2.getAwaitMoveMessage());
//                out.write(move);
//                
//                if(accept2.getAcceptMessage().getErrorCode().equals(ErrorType.NOERROR)){
//                    System.out.println("[INFO] Zweiter Zug war Erfolgreich");
//                    continue;
//                }
//                else if(accept2.getAcceptMessage().getErrorCode().equals(ErrorType.ILLEGAL_MOVE)){
//                    System.out.println("[WARN] zweiter Zug war nicht zulässeg, nehme Dummy-Zug");
//                    MazeCom accept3 = in.readMazeCom();
//                    move = factory.getDummyMove(id,accept3.getAwaitMoveMessage());
//                    out.write(move);
//                    continue;
//                }
            }
        }
    }
}
